﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Runtime.InteropServices;
using System.Security.Permissions;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form

    {
        string status = "Menu";
        string napr = "up";
        //  int step = 0;
        bool IsOver = false;
        bool IsStep = false;
        int length = 5;
        int live = 3;
        int min = 0;
        int sek = 0;
        int msek = 0;
        int time = 0;
        //bool start = false;
        records rec = new records();
        int height = 15;
        int width = 15;

        int[][] Pole = new int[30][];
        int[][] Zmey = new int[50][];

        public Form1()
        {
            InitializeComponent();
        }


        private void новаяИграToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Inicialize();
            pictureBox1.Invalidate();
            status = "Game"; 
        }

        private void таблицаРекордовToolStripMenuItem_Click(object sender, EventArgs e)
        {
            status = "Menu";
            Form2 fr2 = new Form2();
            fr2.Show();
        }

        private void помощьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            status = "Menu";
            MessageBox.Show("Для приостановки/запуска игры, нажмите 'P'\nИзменение движения осуществляется с помощью клавиш: 'Стрелка вверх/вниз/вправо/влево'\nДля перехода на новый уровень Вы должны съесть 10 яблок\nВсего игра имеет 5 уровней\nПосле съедния одного яблока, длина змейки увеличивается на 1 клетку\nЕсли вы врежетесь в преграду/стенку/саму змейку, Вы потеряете 1 жизнь(первоначально их 3)\n\nХорошей игры!", "Помощь");
        }
            
        
        private void pictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
        {
            switch (status)
            {
                case "Game":
                    {
                        timer1.Start();

                        for (int i = 0; i < 30; i++)
                        {
                            for (int j = 0; j < 30; j++)
                            {
                                switch (Pole[i][j])
                                {
                                    case 0:
                                        {
                                            e.Graphics.FillRectangle(new SolidBrush(Color.BurlyWood), 5 + j * width, 5 + i * height, width, height);
                                            e.Graphics.DrawRectangle(new Pen(Color.Brown), 5 + j * width, 5 + i * height, width, height);
                                            break;
                                        }

                                    case 1:
                                        {
                                            e.Graphics.FillRectangle(new SolidBrush(Color.Black), 5 + j * width, 5 + i * height, width, height);
                                            break;
                                        }

                                    case 2:
                                        {
                                            e.Graphics.FillEllipse(new SolidBrush(Color.Red), 5 + j * width, 5 + i * height, width, height);
                                            break;
                                        }

                                    case 3:
                                        {
                                            //e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(100, Color.Red)), 70 + j * width, 30 + i * height, width, height);
                                            break;
                                        }
                                }
                            }
                        }


                        for (int i = 0; i < 50; i++)
                        {
                            if (Zmey[i][0] != -1)
                            {
                                if (i != 0)
                                {
                                    e.Graphics.FillEllipse(new SolidBrush(Color.Blue), 5 + Zmey[i][1] * width, 5 + Zmey[i][0] * height, width, height);
                                    // e.Graphics.FillRectangle(new SolidBrush(Color.Blue), 5 + Zmey[i][1] * width, 5 + Zmey[i][0] * height, width, height);
                                }
                                else
                                {
                                    e.Graphics.FillEllipse(new SolidBrush(Color.CornflowerBlue), 5 + Zmey[i][1] * width, 5 + Zmey[i][0] * height, width, height);
                                    //e.Graphics.FillRectangle(new SolidBrush(Color.Coral), 5 + Zmey[i][1] * width, 5 + Zmey[i][0] * height, width, height);
                                }
                            }
                        }
                        e.Graphics.DrawString("Жизни: ", new Font("Arial", 13), new SolidBrush(Color.Peru), 5, 460);
                        e.Graphics.DrawString(live.ToString(), new Font("Arial", 13), new SolidBrush(Color.Peru), 70, 460);

                        e.Graphics.DrawString("Длина: ", new Font("Arial", 13), new SolidBrush(Color.Peru), 100, 460);
                        e.Graphics.DrawString(length.ToString(), new Font("Arial", 13), new SolidBrush(Color.Peru), 170, 460);
                        //e.Graphics.DrawString("5", new Font("Arial", 13), new SolidBrush(Color.Peru), 170, 460);

                        e.Graphics.DrawString("Время: ", new Font("Arial", 13), new SolidBrush(Color.Peru), 300, 460);
                        //e.Graphics.DrawString(timer1.ToString(), new Font("Arial", 13), new SolidBrush(Color.White), 300, 400);
                        /*   for (int i = 0; i < 10; i++)

                           e.Graphics.DrawString(Zmey[0][1].ToString(), new Font("Arial", 15), new SolidBrush(Color.White), 300, 300);*/

                        //2 level
                        if (length > 30)
                        {
                            for (int i = 0; i < 30; i++)
                            {

                                for (int j = 0; j < 30; j++)
                                {
                                    switch (Pole[i][j])
                                    {
                                        case 0:
                                            {
                                                e.Graphics.FillRectangle(new SolidBrush(Color.GreenYellow), 5 + j * width, 5 + i * height, width, height);
                                                e.Graphics.DrawRectangle(new Pen(Color.Green), 5 + j * width, 5 + i * height, width, height);
                                                break;
                                            }

                                        case 1:
                                            {
                                                e.Graphics.FillRectangle(new SolidBrush(Color.Black), 5 + j * width, 5 + i * height, width, height);
                                                break;
                                            }

                                        case 2:
                                            {
                                                e.Graphics.FillRectangle(new SolidBrush(Color.Red), 5 + j * width, 5 + i * height, width, height);
                                                break;
                                            }

                                        case 3:
                                            {
                                                // e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(100, Color.Green)), 70 + j * width, 30 + i * height, width, height);
                                                break;
                                            }
                                    }
                                }
                            }


                            for (int i = 0; i < 50; i++)
                            {
                                if (Zmey[i][0] != -1)
                                {
                                    if (i != 0)
                                    {
                                        e.Graphics.FillRectangle(new SolidBrush(Color.Blue), 5 + Zmey[i][1] * width, 5 + Zmey[i][0] * height, width, height);
                                    }
                                    else
                                    {
                                        e.Graphics.FillRectangle(new SolidBrush(Color.White), 5 + Zmey[i][1] * width, 5 + Zmey[i][0] * height, width, height);
                                    }
                                }
                            }
                            //e.Graphics.DrawString("lives : ", new Font("Arial", 15), new SolidBrush(Color.White), 5, 440);
                            //e.Graphics.DrawString(live.ToString(), new Font("Arial", 15), new SolidBrush(Color.White), 5, 440);

                            //e.Graphics.DrawString("length : ", new Font("Arial", 15), new SolidBrush(Color.White), 30, 440);
                            //e.Graphics.DrawString(length.ToString(), new Font("Arial", 15), new SolidBrush(Color.White), 30, 440);

                            //e.Graphics.DrawString("time : ", new Font("Arial", 15), new SolidBrush(Color.White), 65, 440);
                            // e.Graphics.DrawString(timer1.ToString(), new Font("Arial", 15), new SolidBrush(Color.White), (576 - 200) / 2 + 250, 550);
                        }

                        
                        break;
                    }


                case "Menu":
                    {
                        timer_null();
                        
                        break;
                    }
            }
            
        }


        private void timer_null()
        {
            timer1.Stop();
            timer1.Dispose();
            label1.Text = "";
            sek = 0;
            msek = 0;
            time = 0;
        } 

        private void timer1_Tick(object sender, EventArgs e)
        {
            msek++;
            if (msek == 9)
            {
                msek = 0;
                sek++;
            }
            if (sek == 60)
            {
                sek = 0;
                min++;
            }
             time = sek;
            label1.Text = Convert.ToString(min) + "мин: " + Convert.ToString(sek) + "с";

            if (!IsOver)
            {
                int X = 0;
                int Y = 0;

                switch (napr)
                {
                    case "right":
                        {
                            X = 1;
                            break;
                        }

                    case "left":
                        {
                            X = -1;
                            break;
                        }
                    case "up":
                        {
                            Y = -1;
                            break;
                        }
                    case "down":
                        {
                            Y = 1;
                            break;
                        }
                }

                if (Zmey[0][0] + Y > 29 || Zmey[0][0] + Y < 0 || Zmey[0][1] + X > 29 || Zmey[0][1] + X < 0 || Pole[Zmey[0][0] + Y][Zmey[0][1] + X] == 3 || Pole[Zmey[0][0] + Y][Zmey[0][1] + X] == 1)
                {
                    if (--live == 0)
                    {
                        timer1.Enabled = false;
                        IsOver = true;
                        MessageBox.Show("Game over!!!");
                        status = "Menu";

                    }
                    else
                    {
                        Inicialize();
                    }
                }
                else
                {
                    if (Pole[Zmey[0][0] + Y][Zmey[0][1] + X] == 2)
                    {
                        TakeApple();
                        Zmey[length][0] = 0;
                        Zmey[length][1] = 0;
                    }


                    Next_Step();

                    Zmey[0][0] += Y;
                    Zmey[0][1] += X;

                    IsStep = true;

                    for (int i = 0; i < Pole.Length; i++)
                    {
                        for (int j = 0; j < Pole[0].Length; j++)
                        {
                            if (Pole[i][j] == 3)
                                Pole[i][j] = 0;
                        }
                    }

                    for (int i = 0; i < Zmey.Length; i++)
                    {
                        if (Zmey[i][0] != -1)
                        {
                            Pole[Zmey[i][0]][Zmey[i][1]] = 3;
                            length = i + 1;
                        }
                    }
                }

                pictureBox1.Invalidate();
            }            

        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.Up:
                    {
                        if (napr != "down" && IsStep)
                        {
                            napr = "up";
                            IsStep = false;
                        }
                        break;
                    }

                case Keys.Down:
                    {
                        if (napr != "up" && IsStep)
                        {
                            napr = "down";
                            IsStep = false;
                        }
                        break;
                    }

                case Keys.Right:
                    {
                        if (napr != "left" && IsStep)
                        {
                            napr = "right";
                            IsStep = false;
                        }
                        break;
                    }

                case Keys.Left:
                    {
                        if (napr != "right" && IsStep)
                        {
                            napr = "left";
                            IsStep = false;
                        }
                        break;
                    }

                case Keys.P:
                    {
                        timer1.Enabled = !timer1.Enabled;
                        break;
                    }

                case Keys.R:
                    {
                        Inicialize();
                        timer1.Enabled = true;
                        IsOver = false;
                        break;
                    }
            }
        }

        private void Inicialize()
        {
            for (int i = 0; i < Pole.Length; i++)
            {
                Pole[i] = new int[30];
            }

            for (int i = 0; i < Zmey.Length; i++)
            {

                Zmey[i] = new int[2];
            }
            Random r = new Random();

            for (int i = 0; i < 50; i++)
            {
                for (int j = 0; j < 2; j++)
                {
                    Zmey[i][j] = -1;
                }

            }

            for (int i = 0; i < 30; i++)
            {
                for (int j = 0; j < 30; j++)
                {
                    Pole[i][j] = 0;
                }

            }

            Zmey[0][0] = 10;
            Zmey[0][1] = 16;

            Zmey[1][0] = 10;
            Zmey[1][1] = 17;

            Zmey[2][0] = 10;
            Zmey[2][1] = 18;

            Zmey[3][0] = 10;
            Zmey[3][1] = 19;

            Zmey[4][0] = 11;
            Zmey[4][1] = 19;

            Pole[12][16] = 1;
            Pole[12][17] = 1;

            Pole[13][16] = 1;
            Pole[14][16] = 1;
            Pole[12][19] = 1;
            Pole[13][19] = 1;
            Pole[12][18] = 1;
            Pole[15][16] = 1;
            //Pole[20][16] = 1;

            Pole[5][5] = 1;
            Pole[5][6] = 1;
            Pole[5][8] = 1;
            Pole[5][4] = 1;

            Pole[7][6] = 1;

            Pole[5][7] = 1;
            Pole[6][6] = 1;

            //Pole[10][8] = 2;
            //pictureBox1.Invalidate();
            TakeApple();
        }

        private void Next_Step()
        {
            for (int i = Zmey.Length - 1; i > 0; i--)
            {
                if (Zmey[i][0] != -1)
                {
                    Zmey[i][0] = Zmey[i - 1][0];
                    Zmey[i][1] = Zmey[i - 1][1];
                }
            }
        }

        private void TakeApple()
        {
            int x1, x2;

            Random r = new Random();

            do
            {
                x1 = r.Next(0, 29);
                x2 = r.Next(0, 29);
                if (Pole[x1][x2] == 0)
                    Pole[x1][x2] = 2;
            }
            while (Pole[x1][x2] != 2);


        }

        private void Rec ()
        {
            if (rec.Check(length * 10))
            {
                //MessageBox.Show("Поздравляем! Вы набрали достаточное количество очков для попадания в таблицу рекордов!");
                Form3 fr3 = new Form3();
                fr3.Show();
            }
            else
            {
                MessageBox.Show("Увы, Вы набрали недостаточное количество \nочков для попадания в таблицу рекордов.\n Попробуйте сыграть еще раз.","Мало очков");
 
            }
 
        }




        private void pictureBox1_Click(object sender, EventArgs e)
        {
        }

        private void menuStrip1_Paint(object sender, PaintEventArgs e)
        {
        }

        private void Form1_Load(object sender, EventArgs e)
        {
        }

        private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
        {
        }
    }
}
